μμ‘΄μ± λΆμ λ° μμ‘΄μ± κ·Έλνλ₯Ό μ¬μ©νμ¬ λ¦¬μ‘νΈ μ»€μ€ν ν μ μ΄ν΄νκ³ μ΅μ ννμΈμ. 리μ‘νΈ μ ν리μΌμ΄μ μ μ±λ₯κ³Ό μ μ§λ³΄μμ±μ ν₯μμν΅λλ€.
리μ‘νΈ μ»€μ€ν ν μμ‘΄μ± λΆμ: ν μμ‘΄μ± κ·Έλνλ‘ μκ°ννκΈ°
리μ‘νΈ μ»€μ€ν ν μ μ»΄ν¬λνΈμμ μ¬μ¬μ© κ°λ₯ν λ‘μ§μ μΆμΆνλ κ°λ ₯ν λ°©λ²μ λλ€. 볡μ‘ν λμμ μΊ‘μννμ¬ λ κΉ¨λνκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ½λλ₯Ό μμ±ν μ μκ² ν΄μ€λλ€. νμ§λ§ μ ν리μΌμ΄μ μ΄ μ»€μ§λ©΄μ 컀μ€ν ν λ΄μ μμ‘΄μ±μ κ΄λ¦¬νκΈ°κ° μ΄λ €μμ§ μ μμ΅λλ€. μ΄λ¬ν μμ‘΄μ±μ μ΄ν΄νλ κ²μ μ±λ₯μ μ΅μ ννκ³ μκΈ°μΉ μμ λ²κ·Έλ₯Ό λ°©μ§νλ λ° λ§€μ° μ€μν©λλ€. μ΄ κΈμμλ 리μ‘νΈ μ»€μ€ν ν μ μμ‘΄μ± λΆμ κ°λ μ νꡬνκ³ , ν μμ‘΄μ± κ·Έλνλ₯Ό μ¬μ©νμ¬ μ΄λ¬ν μμ‘΄μ±μ μκ°ννλ μμ΄λμ΄λ₯Ό μκ°ν©λλ€.
리μ‘νΈ μ»€μ€ν ν μμ μμ‘΄μ± λΆμμ΄ μ€μν μ΄μ
컀μ€ν ν μ μμ‘΄μ±μ μ΄ν΄νλ κ²μ μ¬λ¬ κ°μ§ μ΄μ λ‘ νμμ μ λλ€:
- μ±λ₯ μ΅μ ν:
useEffect,useCallback,useMemoμμ λΆμ ννκ±°λ λΆνμν μμ‘΄μ±μ λΆνμν μ¬λ λλ§κ³Ό κ³μ°μ μ΄λν μ μμ΅λλ€. μμ‘΄μ±μ μ μ€νκ² λΆμν¨μΌλ‘μ¨, μ΄λ¬ν ν λ€μ΄ μ λ§ νμν λλ§ λ€μ μ€νλλλ‘ μ΅μ νν μ μμ΅λλ€. - μ½λ μ μ§λ³΄μμ±: λͺ ννκ³ μ μ μλ μμ‘΄μ±μ μ½λλ₯Ό λ μ½κ² μ΄ν΄νκ³ μ μ§λ³΄μν μ μκ² λ§λλλ€. μμ‘΄μ±μ΄ λΆλΆλͺ νλ©΄, ν μ΄ λ€λ₯Έ μν©μμ μ΄λ»κ² λμν μ§ μΆλ‘ νκΈ°κ° μ΄λ €μμ§λλ€.
- λ²κ·Έ μλ°©: μμ‘΄μ±μ μλͺ» μ΄ν΄νλ©΄ λ―Έλ¬νκ³ λλ²κΉ νκΈ° μ΄λ €μ΄ μ€λ₯λ‘ μ΄μ΄μ§ μ μμ΅λλ€. μλ₯Ό λ€μ΄, ν μ΄ λ³κ²½λμμ§λ§ μμ‘΄μ± λ°°μ΄μ ν¬ν¨λμ§ μμ κ°μ μμ‘΄ν λ μ€λλ ν΄λ‘μ (stale closure)κ° λ°μν μ μμ΅λλ€.
- μ½λ μ¬μ¬μ©μ±: 컀μ€ν ν μ μμ‘΄μ±μ μ΄ν΄ν¨μΌλ‘μ¨, λ€λ₯Έ μ»΄ν¬λνΈλ μ ν리μΌμ΄μ μμ μ΄λ»κ² μ¬μ¬μ©λ μ μλμ§ λ μ μ΄ν΄ν μ μμ΅λλ€.
ν μμ‘΄μ± μ΄ν΄νκΈ°
리μ‘νΈλ μμ‘΄μ± λ°°μ΄μ μ¬μ©νμ¬ μΈμ λ€μ μ€ννκ±°λ μ λ°μ΄νΈν΄μΌ ν μ§ κ²°μ νλ μ¬λ¬ ν μ μ 곡ν©λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ©λλ€:
useEffect: μ»΄ν¬λνΈκ° λ λλ§λ ν μ¬μ΄λ μ΄ννΈλ₯Ό μ€νν©λλ€. μμ‘΄μ± λ°°μ΄μ μΈμ μ΄ννΈκ° λ€μ μ€νλμ΄μΌ νλμ§λ₯Ό κ²°μ ν©λλ€.useCallback: μ½λ°± ν¨μλ₯Ό λ©λͺ¨μ΄μ μ΄μ ν©λλ€. μμ‘΄μ± λ°°μ΄μ μΈμ ν¨μκ° μ¬μμ±λμ΄μΌ νλμ§λ₯Ό κ²°μ ν©λλ€.useMemo: κ°μ λ©λͺ¨μ΄μ μ΄μ ν©λλ€. μμ‘΄μ± λ°°μ΄μ μΈμ κ°μ΄ μ¬κ³μ°λμ΄μΌ νλμ§λ₯Ό κ²°μ ν©λλ€.
μμ‘΄μ±μ΄λ ν λ΄μμ μ¬μ©λλ©°, λ³κ²½λ κ²½μ° ν μ΄ λ€μ μ€νλκ±°λ μ λ°μ΄νΈλμ΄μΌ νλ λͺ¨λ κ°μ μλ―Έν©λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ μ μμ΅λλ€:
- Props: λΆλͺ¨ μ»΄ν¬λνΈλ‘λΆν° μ λ¬λ κ°.
- State:
useStateν μΌλ‘ κ΄λ¦¬λλ κ°. - Refs:
useRefν μΌλ‘ κ΄λ¦¬λλ λ³κ²½ κ°λ₯ν κ°. - κΈ°ν ν : λ€λ₯Έ 컀μ€ν ν μμ λ°νλ κ°.
- ν¨μ: μ»΄ν¬λνΈλ λ€λ₯Έ ν λ΄μμ μ μλ ν¨μ.
- μ£Όλ³ μ€μ½νμ λ³μ: μ΄κ²λ€μ μ’ μ’ λ²κ·Έλ₯Ό μ λ°νλ―λ‘ μ£Όμν΄μΌ ν©λλ€.
μμ : μμ‘΄μ±μ κ°μ§ κ°λ¨ν 컀μ€ν ν
APIμμ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ λ€μ 컀μ€ν ν μ μ΄ν΄λ³΄κ² μ΅λλ€:
function useFetch(url) {
const [data, setData] = React.useState(null);
const [loading, setLoading] = React.useState(true);
const [error, setError] = React.useState(null);
React.useEffect(() => {
const fetchData = async () => {
setLoading(true);
try {
const response = await fetch(url);
const json = await response.json();
setData(json);
} catch (error) {
setError(error);
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return { data, loading, error };
}
μ΄ μμ μμ useFetch ν
μ urlμ΄λΌλ λ¨μΌ μμ‘΄μ±μ κ°μ§λλ€. μ΄λ url propμ΄ λ³κ²½λ λλ§ effectκ° λ€μ μ€νλλ€λ κ²μ μλ―Έν©λλ€. URLμ΄ λ€λ₯Ό λλ§ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ³ μΆκΈ° λλ¬Έμ μ΄λ μ€μν©λλ€.
볡μ‘ν μμ‘΄μ±μ μ΄λ €μ
컀μ€ν ν μ΄ λ 볡μ‘ν΄μ§μλ‘ μμ‘΄μ± κ΄λ¦¬κ° μ΄λ €μμ§ μ μμ΅λλ€. λ€μ μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
function useComplexHook(propA, propB, propC) {
const [stateA, setStateA] = React.useState(0);
const [stateB, setStateB] = React.useState(0);
const memoizedValue = React.useMemo(() => {
// Complex computation based on propA, stateA, and propB
return propA * stateA + propB;
}, [propA, stateA, propB]);
const callbackA = React.useCallback(() => {
// Update stateA based on propC and stateB
setStateA(propC + stateB);
}, [propC, stateB]);
React.useEffect(() => {
// Side effect based on memoizedValue and callbackA
console.log("Effect running");
callbackA();
}, [memoizedValue, callbackA]);
return { stateA, stateB, memoizedValue, callbackA };
}
μ΄ μμ μμλ μμ‘΄μ±μ΄ λ 볡μ‘νκ² μ½ν μμ΅λλ€. memoizedValueλ propA, stateA, propBμ μμ‘΄ν©λλ€. callbackAλ propCμ stateBμ μμ‘΄ν©λλ€. κ·Έλ¦¬κ³ useEffectλ memoizedValueμ callbackAμ μμ‘΄ν©λλ€. μ΄λ¬ν κ΄κ³λ₯Ό μΆμ νκ³ μμ‘΄μ±μ΄ μ¬λ°λ₯΄κ² μ§μ λμλμ§ νμΈνκΈ° μ΄λ €μΈ μ μμ΅λλ€.
ν μμ‘΄μ± κ·Έλν μκ°
ν μμ‘΄μ± κ·Έλνλ 컀μ€ν ν λ΄μμ κ·Έλ¦¬κ³ λ€λ₯Έ 컀μ€ν ν κ°μ μμ‘΄μ±μ μκ°μ μΌλ‘ ννν κ²μ λλ€. ν λ΄μ μ¬λ¬ κ°λ€μ΄ μ΄λ»κ² κ΄λ ¨λμ΄ μλμ§ λͺ ννκ³ κ°κ²°νκ² μ΄ν΄ν μ μλ λ°©λ²μ μ 곡ν©λλ€. μ΄λ μ±λ₯ λ¬Έμ λ₯Ό λλ²κΉ νκ³ μ½λ μ μ§λ³΄μμ±μ ν₯μμν€λ λ° λ§€μ° μ μ©ν μ μμ΅λλ€.
μμ‘΄μ± κ·Έλνλ 무μμΈκ°?
μμ‘΄μ± κ·Έλνλ λ€μκ³Ό κ°μ μ ν₯ κ·Έλνμ λλ€:
- λ Έλ: props, state, refs, λ€λ₯Έ ν κ³Ό κ°μ ν λ΄μ κ°μ λνλ λλ€.
- μ£μ§(κ°μ ): κ°λ€ μ¬μ΄μ μμ‘΄μ±μ λνλ λλ€. λ Έλ Aμμ λ Έλ Bλ‘ κ°λ μ£μ§λ λ Έλ Bκ° λ Έλ Aμ μμ‘΄νλ€λ κ²μ μλ―Έν©λλ€.
볡μ‘ν ν μμ μκ°ννκΈ°
μμ useComplexHook μμ μ λν μμ‘΄μ± κ·Έλνλ₯Ό μκ°νν΄ λ³΄κ² μ΅λλ€. κ·Έλνλ λ€μκ³Ό κ°μ κ²μ
λλ€:
propA --> memoizedValue propB --> memoizedValue stateA --> memoizedValue propC --> callbackA stateB --> callbackA memoizedValue --> useEffect callbackA --> useEffect
μ΄ κ·Έλνλ μ¬λ¬ κ°λ€μ΄ μ΄λ»κ² κ΄λ ¨λμ΄ μλμ§ λͺ
ννκ² λ³΄μ¬μ€λλ€. μλ₯Ό λ€μ΄, memoizedValueκ° propA, propB, stateAμ μμ‘΄νλ€λ κ²μ μ μ μμ΅λλ€. λν useEffectκ° memoizedValueμ callbackA λͺ¨λμ μμ‘΄νλ€λ κ²λ μ μ μμ΅λλ€.
ν μμ‘΄μ± κ·Έλν μ¬μ©μ μ΄μ
ν μμ‘΄μ± κ·Έλνλ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ μ¬λ¬ μ΄μ μ μ»μ μ μμ΅λλ€:
- μ΄ν΄λ ν₯μ: μμ‘΄μ±μ μκ°ννλ©΄ 컀μ€ν ν λ΄μ 볡μ‘ν κ΄κ³λ₯Ό λ μ½κ² μ΄ν΄ν μ μμ΅λλ€.
- μ±λ₯ μ΅μ ν: λΆνμν μμ‘΄μ±μ μλ³νμ¬ λΆνμν μ¬λ λλ§κ³Ό κ³μ°μ μ€μ΄λλ‘ ν μ μ΅μ νν μ μμ΅λλ€.
- μ½λ μ μ§λ³΄μμ±: λͺ νν μμ‘΄μ± κ·Έλνλ μ½λλ₯Ό λ μ½κ² μ΄ν΄νκ³ μ μ§λ³΄μν μ μκ² λ§λλλ€.
- λ²κ·Έ κ°μ§: μμ‘΄μ± κ·Έλνλ μ€λλ ν΄λ‘μ λ λλ½λ μμ‘΄μ±κ³Ό κ°μ μ μ¬μ μΈ λ²κ·Έλ₯Ό μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€.
- 리ν©ν λ§: 볡μ‘ν ν μ 리ν©ν λ§ν λ, μμ‘΄μ± κ·Έλνλ λ³κ²½ μ¬νμ μν₯μ μ΄ν΄νλ λ° λμμ΄ λ μ μμ΅λλ€.
ν μμ‘΄μ± κ·Έλν μμ±μ μν λꡬ λ° κΈ°μ
ν μμ‘΄μ± κ·Έλνλ₯Ό λ§λλ λ° μ¬μ©ν μ μλ λͺ κ°μ§ λꡬμ κΈ°μ μ΄ μμ΅λλ€:
- μλ λΆμ: μ½λλ₯Ό μλμΌλ‘ λΆμνκ³ μ’ μ΄λ λ€μ΄μ΄κ·Έλ¨ λꡬλ₯Ό μ¬μ©νμ¬ μμ‘΄μ± κ·Έλνλ₯Ό 그릴 μ μμ΅λλ€. μ΄λ κ°λ¨ν ν μ μμμ μΌλ‘ μ’μ μ μμ§λ§, λ 볡μ‘ν ν μ κ²½μ° μ§λ£¨ν΄μ§ μ μμ΅λλ€.
- λ¦°ν λꡬ: ESLintμ κ°μ μΌλΆ λ¦°ν λꡬλ νΉμ νλ¬κ·ΈμΈκ³Ό ν¨κ» μ½λλ₯Ό λΆμνκ³ μ μ¬μ μΈ μμ‘΄μ± λ¬Έμ λ₯Ό μλ³ν μ μμ΅λλ€. μ΄λ¬ν λꡬλ μ’ μ’ κΈ°λ³Έμ μΈ μμ‘΄μ± κ·Έλνλ₯Ό μμ±ν μ μμ΅λλ€.
- μ¬μ©μ μ μ μ½λ λΆμ: 리μ‘νΈ μ»΄ν¬λνΈμ ν μ λΆμνκ³ μμ‘΄μ± κ·Έλνλ₯Ό μμ±νλ μ¬μ©μ μ μ μ½λλ₯Ό μμ±ν μ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ κ°μ₯ ν° μ μ°μ±μ μ 곡νμ§λ§ λ λ§μ λ Έλ ₯μ΄ νμν©λλ€.
- React DevTools νλ‘νμΌλ¬: React DevTools νλ‘νμΌλ¬λ λΆνμν μ¬λ λλ§κ³Ό κ΄λ ¨λ μ±λ₯ λ¬Έμ λ₯Ό μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€. μ§μ μ μΌλ‘ μμ‘΄μ± κ·Έλνλ₯Ό μμ±νμ§λ μμ§λ§, ν μ΄ μ΄λ»κ² λμνλμ§μ λν κ·μ€ν ν΅μ°°λ ₯μ μ 곡ν μ μμ΅λλ€.
μμ : eslint-plugin-react-hooksμ ν¨κ» ESLint μ¬μ©νκΈ°
ESLintμ© eslint-plugin-react-hooks νλ¬κ·ΈμΈμ 리μ‘νΈ ν
μ μμ‘΄μ± λ¬Έμ λ₯Ό μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€. μ΄ νλ¬κ·ΈμΈμ μ¬μ©νλ €λ©΄ μ€μΉνκ³ ESLint μ€μ νμΌμμ ꡬμ±ν΄μΌ ν©λλ€.
{
"plugins": [
"react-hooks"
],
"rules": {
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": "warn"
}
}
react-hooks/exhaustive-deps κ·μΉμ useEffect, useCallback λλ useMemo ν
μ λλ½λ μμ‘΄μ±μ΄ μμ κ²½μ° κ²½κ³ λ₯Ό νμν©λλ€. μκ°μ μΈ κ·Έλνλ₯Ό μμ±νμ§λ μμ§λ§, μ½λ λ° μ±λ₯ ν₯μμΌλ‘ μ΄μ΄μ§ μ μλ μμ‘΄μ±μ λν μ μ©ν νΌλλ°±μ μ 곡ν©λλ€.
ν μμ‘΄μ± κ·Έλν μ¬μ©μ μ€μ μμ
μμ 1: κ²μ ν μ΅μ ννκΈ°
κ²μ 쿼리λ₯Ό κΈ°λ°μΌλ‘ APIμμ κ²μ κ²°κ³Όλ₯Ό κ°μ Έμ€λ κ²μ ν μ΄ μλ€κ³ μμν΄ λ³΄μΈμ. μ²μμλ ν μ΄ λ€μκ³Ό κ°μ μ μμ΅λλ€:
function useSearch(query) {
const [results, setResults] = React.useState([]);
React.useEffect(() => {
const fetchResults = async () => {
const response = await fetch(`/api/search?q=${query}`);
const data = await response.json();
setResults(data);
};
fetchResults();
}, [query]);
return results;
}
κ·Έλ¬λ queryκ° λ³κ²½λμ§ μμμμλ ν
μ΄ λ€μ μ€νλλ κ²μ λ°κ²¬ν©λλ€. μμ‘΄μ± κ·Έλνλ₯Ό λΆμν ν, query propμ΄ λΆλͺ¨ μ»΄ν¬λνΈμ μν΄ λΆνμνκ² μ
λ°μ΄νΈλκ³ μμμ κΉ¨λ«μ΅λλ€.
μ€μ κ²μ μΏΌλ¦¬κ° λ³κ²½λ λλ§ query propμ μ
λ°μ΄νΈνλλ‘ λΆλͺ¨ μ»΄ν¬λνΈλ₯Ό μ΅μ νν¨μΌλ‘μ¨, λΆνμν μ¬λ λλ§μ λ°©μ§νκ³ κ²μ ν
μ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
μμ 2: μ€λλ ν΄λ‘μ (Stale Closure) λ°©μ§νκΈ°
νμ΄λ¨Έλ₯Ό μ¬μ©νμ¬ κ°μ μ λ°μ΄νΈνλ 컀μ€ν ν μ΄ μλ μλ리μ€λ₯Ό μκ°ν΄ λ³΄κ² μ΅λλ€. ν μ λ€μκ³Ό κ°μ μ μμ΅λλ€:
function useTimer() {
const [count, setCount] = React.useState(0);
React.useEffect(() => {
const intervalId = setInterval(() => {
setCount(count + 1); // Potential stale closure issue
}, 1000);
return () => clearInterval(intervalId);
}, []);
return count;
}
μ΄ μμ μμλ μ»΄ν¬λνΈκ° μ¬λ λλ§λ λ setInterval μ½λ°± λ΄λΆμ count κ°μ΄ μ
λ°μ΄νΈλμ§ μκΈ° λλ¬Έμ μ μ¬μ μΈ μ€λλ ν΄λ‘μ λ¬Έμ κ° μμ΅λλ€. μ΄λ μμμΉ λͺ»ν λμμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
countλ₯Ό μμ‘΄μ± λ°°μ΄μ ν¬ν¨μν΄μΌλ‘μ¨ μ½λ°±μ΄ νμ μ΅μ count κ°μ μ κ·Όν μ μλλ‘ λ³΄μ₯ν μ μμ΅λλ€:
function useTimer() {
const [count, setCount] = React.useState(0);
React.useEffect(() => {
const intervalId = setInterval(() => {
setCount(prevCount => prevCount + 1);
}, 1000);
return () => clearInterval(intervalId);
}, []);
return count;
}
λλ, λ λμ ν΄κ²°μ± μ μμ‘΄μ±μ μμ ν νΌνκ³ , `setState`μ ν¨μν μ λ°μ΄νΈλ₯Ό μ¬μ©νμ¬ *μ΄μ * μνλ₯Ό κΈ°λ°μΌλ‘ *μλ‘μ΄* μνλ₯Ό κ³μ°νλ κ²μ λλ€.
κ³ κΈ κ³ λ €μ¬ν
μμ‘΄μ± μ΅μν
μμ‘΄μ± λΆμμ μ£Όμ λͺ©ν μ€ νλλ 컀μ€ν ν μ μμ‘΄μ± μλ₯Ό μ΅μννλ κ²μ λλ€. μμ‘΄μ±μ΄ μ μμλ‘ λΆνμν μ¬λ λλ§ κ°λ₯μ±μ΄ μ€μ΄λ€κ³ μ±λ₯μ΄ ν₯μλ©λλ€.
μμ‘΄μ±μ μ΅μννκΈ° μν λͺ κ°μ§ κΈ°μ μ λ€μκ³Ό κ°μ΅λλ€:
useRefμ¬μ©: κ°μ΄ λ³κ²½λ λ μ¬λ λλ§μ μ λ°νμ§ μλ κ°μ μ μ₯ν΄μΌ νλ κ²½μ°,useStateλμuseRefλ₯Ό μ¬μ©νμΈμ.useCallbackλ°useMemoμ¬μ©: λΆνμν μ¬μμ±μ λ°©μ§νκΈ° μν΄ ν¨μμ κ°μ λ©λͺ¨μ΄μ μ΄μ νμΈμ.- μν λμ΄μ¬λ¦¬κΈ°(Lifting State Up): κ°μ΄ λ¨μΌ μ»΄ν¬λνΈμμλ§ μ¬μ©λλ κ²½μ°, μνλ₯Ό λΆλͺ¨ μ»΄ν¬λνΈλ‘ λμ΄μ¬λ € μμ μ»΄ν¬λνΈμ μμ‘΄μ±μ μ€μ΄λ κ²μ κ³ λ €νμΈμ.
- ν¨μν μ
λ°μ΄νΈ: μ΄μ μνλ₯Ό κΈ°λ°μΌλ‘ μνλ₯Ό μ
λ°μ΄νΈν κ²½μ°, νμ¬ μν κ°μ λν μμ‘΄μ±μ νΌνκΈ° μν΄
setStateμ ν¨μν νν(μ:setState(prevState => prevState + 1))λ₯Ό μ¬μ©νμΈμ.
컀μ€ν ν μ‘°ν©
컀μ€ν ν μ μ‘°ν©ν λλ κ·Έλ€ μ¬μ΄μ μμ‘΄μ±μ μ μ€νκ² κ³ λ €νλ κ²μ΄ μ€μν©λλ€. μμ‘΄μ± κ·Έλνλ μ΄ μλ리μ€μμ νΉν μ μ©ν μ μμΌλ©°, μ¬λ¬ ν μ΄ μ΄λ»κ² κ΄λ ¨λμ΄ μλμ§ μκ°ννκ³ μ μ¬μ μΈ μ±λ₯ λ³λͺ© νμμ μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€.
컀μ€ν ν κ°μ μμ‘΄μ±μ΄ μ μ μλμ΄ μκ³ κ° ν μ΄ μ§μ μΌλ‘ νμν κ°μλ§ μμ‘΄νλμ§ νμΈνμΈμ. μν μμ‘΄μ±μ λ§λ€μ§ μλλ‘ μ£Όμν΄μΌ ν©λλ€. μ΄λ 무ν 루νλ λ€λ₯Έ μκΈ°μΉ μμ λμμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
리μ‘νΈ κ°λ°μ μν κΈλ‘λ² κ³ λ €μ¬ν
κΈλ‘λ² μ¬μ©μλ₯Ό μν 리μ‘νΈ μ ν리μΌμ΄μ μ κ°λ°ν λλ μ¬λ¬ μμλ₯Ό κ³ λ €νλ κ²μ΄ μ€μν©λλ€:
- κ΅μ ν (i18n): μ¬λ¬ μΈμ΄μ μ§μμ μ§μνκΈ° μν΄ i18n λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμΈμ. μ¬κΈ°μλ ν μ€νΈ λ²μ, λ μ§ λ° μ«μ μμ μ§μ , λ€λ₯Έ ν΅ν μ²λ¦¬κ° ν¬ν¨λ©λλ€.
- νμ§ν (l10n): λ¬Ένμ μ°¨μ΄μ μ νΈλλ₯Ό κ³ λ €νμ¬ νΉμ λ‘μΌμΌμ λ§κ² μ ν리μΌμ΄μ μ μ‘°μ νμΈμ.
- μ κ·Όμ± (a11y): μ₯μ κ° μλ μ¬μ©μκ° μ ν리μΌμ΄μ μ μ κ·Όν μ μλλ‘ λ³΄μ₯νμΈμ. μ¬κΈ°μλ μ΄λ―Έμ§μ λν λ체 ν μ€νΈ μ 곡, μλ§¨ν± HTML μ¬μ©, μ ν리μΌμ΄μ μ΄ ν€λ³΄λλ‘ μ κ·Ό κ°λ₯νλλ‘ λ³΄μ₯νλ κ²μ΄ ν¬ν¨λ©λλ€.
- μ±λ₯: λ€μν μΈν°λ· μλμ μ₯μΉλ₯Ό κ°μ§ μ¬μ©μλ₯Ό μν΄ μ ν리μΌμ΄μ μ μ΅μ ννμΈμ. μ¬κΈ°μλ μ½λ λΆν , μ΄λ―Έμ§ μ§μ° λ‘λ©, CSS λ° JavaScript μ΅μ νκ° ν¬ν¨λ©λλ€. CDNμ μ¬μ©νμ¬ μ¬μ©μμκ² λ κ°κΉμ΄ μλ²μμ μ μ μμ°μ μ 곡νλ κ²μ κ³ λ €νμΈμ.
- μκ°λ: λ μ§μ μκ°μ νμν λ μκ°λλ₯Ό μ¬λ°λ₯΄κ² μ²λ¦¬νμΈμ. Moment.jsλ date-fnsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μκ°λ λ³νμ μ²λ¦¬νμΈμ.
- ν΅ν: μ¬μ©μμ μμΉμ λ§λ μ¬λ°λ₯Έ ν΅νλ‘ κ°κ²©μ νμνμΈμ. Intl.NumberFormatκ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ ν΅νλ₯Ό μ¬λ°λ₯΄κ² μμ μ§μ νμΈμ.
- μ«μ μμ: μ¬μ©μμ μμΉμ λ§λ μ¬λ°λ₯Έ μ«μ μμμ μ¬μ©νμΈμ. λ‘μΌμΌλ§λ€ μμμ κ³Ό μ² λ¨μ κ΅¬λΆ κΈ°νΈκ° λ€λ¦ λλ€.
- λ μ§ μμ: μ¬μ©μμ μμΉμ λ§λ μ¬λ°λ₯Έ λ μ§ μμμ μ¬μ©νμΈμ. λ‘μΌμΌλ§λ€ λ μ§ νμμ΄ λ€λ¦ λλ€.
- μ€λ₯Έμͺ½μμ μΌμͺ½ (RTL) μ§μ: μ ν리μΌμ΄μ μ΄ μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μ°λ μΈμ΄λ₯Ό μ§μν΄μΌ νλ κ²½μ°, CSSμ λ μ΄μμμ΄ RTL ν μ€νΈλ₯Ό μ²λ¦¬νλλ‘ μ¬λ°λ₯΄κ² ꡬμ±λμλμ§ νμΈνμΈμ.
κ²°λ‘
μμ‘΄μ± λΆμμ 리μ‘νΈ μ»€μ€ν ν μ κ°λ°νκ³ μ μ§λ³΄μνλ λ° μμ΄ μ€μν μΈ‘λ©΄μ λλ€. ν λ΄μ μμ‘΄μ±μ μ΄ν΄νκ³ ν μμ‘΄μ± κ·Έλνλ₯Ό μ¬μ©νμ¬ μκ°νν¨μΌλ‘μ¨ μ±λ₯μ μ΅μ ννκ³ μ½λ μ μ§λ³΄μμ±μ ν₯μμν€λ©° λ²κ·Έλ₯Ό μλ°©ν μ μμ΅λλ€. 리μ‘νΈ μ ν리μΌμ΄μ μ 볡μ‘μ±μ΄ μ¦κ°ν¨μ λ°λΌ μμ‘΄μ± λΆμμ μ΄μ μ λμ± μ€μν΄μ§λλ€.
μ΄ κΈμμ μ€λͺ ν λꡬμ κΈ°μ μ μ¬μ©νμ¬ μ»€μ€ν ν μ λν λ κΉμ μ΄ν΄λ₯Ό μ»κ³ , κΈλ‘λ² μ¬μ©μλ₯Ό μν λ κ²¬κ³ νκ³ ν¨μ¨μ μΈ λ¦¬μ‘νΈ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€.